

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>



<head>
  <meta name="referrer" content="no-referrer" />
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/apple-touch-icon.png">
  <link rel="icon" href="/img/fyy.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="fyy">
  <meta name="keywords" content="">
  
    <meta name="description" content="基本概念数据库术语 数据库（database） - 保存有组织的数据的容器（通常是一个文件或一组文件）。 数据表（table） - 某种特定类型数据的结构化清单。 模式（schema） - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储，包含存储什么样的数据，数据如何分解，各部分信息如何命名等信息。数据库和表都有模式。&#x2F;&#x2F; 模式到底是什么？？？ 列（column） - 表中的一个字">
<meta property="og:type" content="article">
<meta property="og:title" content="SQL语法基础知识.md">
<meta property="og:url" content="http://example.com/2024/02/27/DB/basic_knowledge/SQL%E8%AF%AD%E6%B3%95%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/index.html">
<meta property="og:site_name" content="fyy-coding">
<meta property="og:description" content="基本概念数据库术语 数据库（database） - 保存有组织的数据的容器（通常是一个文件或一组文件）。 数据表（table） - 某种特定类型数据的结构化清单。 模式（schema） - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储，包含存储什么样的数据，数据如何分解，各部分信息如何命名等信息。数据库和表都有模式。&#x2F;&#x2F; 模式到底是什么？？？ 列（column） - 表中的一个字">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/cb684d4c75fc430e92aaee226069c7da~tplv-k3u1fbpfcp-zoom-1.png">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/c439da1f5d4e4b00bdfa4316b933d764~tplv-k3u1fbpfcp-zoom-1.png">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/701670942f0f45d3a3a2187cd04a12ad~tplv-k3u1fbpfcp-zoom-1.png">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/ec4c975296ea4a7097879dac7c353878~tplv-k3u1fbpfcp-zoom-1.jpeg">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/60afdc9c9a594f079727ec64a2e698a3~tplv-k3u1fbpfcp-zoom-1.jpeg">
<meta property="og:image" content="https://oss.javaguide.cn/p3-juejin/93a5e011ade4450ebfa5d82057532a49~tplv-k3u1fbpfcp-zoom-1.png">
<meta property="article:published_time" content="2024-02-27T08:49:52.217Z">
<meta property="article:modified_time" content="2024-03-26T12:50:28.791Z">
<meta property="article:author" content="fyy">
<meta property="article:tag" content="DB">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://oss.javaguide.cn/p3-juejin/cb684d4c75fc430e92aaee226069c7da~tplv-k3u1fbpfcp-zoom-1.png">
  
  
  
  <title>SQL语法基础知识.md - fyy-coding</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css" />
  




  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"example.com","root":"/","version":"1.9.7","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":true,"follow_dnt":true,"baidu":null,"google":{"measurement_id":null},"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":"ufph8TbmK43d1JfQxLvss4KY-MdYXbMMI","app_key":"96APiPOtZEiCQlv5h3jjZfbC","server_url":null,"path":"window.location.pathname","ignore_local":false}},"search_path":"/local-search.xml","include_content_in_search":true};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
  

  

  
    <!-- Google tag (gtag.js) -->
    <script async>
      if (!Fluid.ctx.dnt) {
        Fluid.utils.createScript("https://www.googletagmanager.com/gtag/js?id=", function() {
          window.dataLayer = window.dataLayer || [];
          function gtag() {
            dataLayer.push(arguments);
          }
          gtag('js', new Date());
          gtag('config', '');
        });
      }
    </script>
  

  

  

  

  
    
  



  
<meta name="generator" content="Hexo 6.3.0"></head>


<body>
  

  <header>
    

<div class="header-inner" style="height: 70vh;">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/">
      <strong>fyy-coding</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/" target="_self">
                <i class="iconfont icon-home-fill"></i>
                <span>首页</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/" target="_self">
                <i class="iconfont icon-archive-fill"></i>
                <span>归档</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/" target="_self">
                <i class="iconfont icon-category-fill"></i>
                <span>分类</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/" target="_self">
                <i class="iconfont icon-tags-fill"></i>
                <span>标签</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/" target="_self">
                <i class="iconfont icon-user-fill"></i>
                <span>关于</span>
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              <i class="iconfont icon-search"></i>
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
              <i class="iconfont icon-dark" id="color-toggle-icon"></i>
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

  

<div id="banner" class="banner" parallax=true
     style="background: url('/img/default.png') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">
    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">
        <div class="h2">
          
            <span id="subtitle" data-typed-text="SQL语法基础知识.md"></span>
          
        </div>

        
          
  <div class="mt-3">
    
    
      <span class="post-meta">
        <i class="iconfont icon-date-fill" aria-hidden="true"></i>
        <time datetime="2024-02-27 16:49" pubdate>
          2024年2月27日 下午
        </time>
      </span>
    
  </div>

  <div class="mt-1">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-chart"></i>
        
          8.1k 字
        
      </span>
    

    
      <span class="post-meta mr-2">
        <i class="iconfont icon-clock-fill"></i>
        
        
        
          68 分钟
        
      </span>
    

    
    
      
        <span id="leancloud-page-views-container" class="post-meta" style="display: none">
          <i class="iconfont icon-eye" aria-hidden="true"></i>
          <span id="leancloud-page-views"></span> 次
        </span>
        
      
    
  </div>


        
      </div>

      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      

    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <h1 id="seo-header">SQL语法基础知识.md</h1>
            
            
              <div class="markdown-body">
                
                <h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><h3 id="数据库术语"><a href="#数据库术语" class="headerlink" title="数据库术语"></a>数据库术语</h3><ul>
<li><code>数据库（database）</code> - 保存有组织的数据的容器（通常是一个文件或一组文件）。</li>
<li><code>数据表（table）</code> - 某种特定类型数据的结构化清单。</li>
<li><code>模式（schema）</code> - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储，包含存储什么样的数据，数据如何分解，各部分信息如何命名等信息。数据库和表都有模式。<code>// 模式到底是什么？？？</code></li>
<li><code>列（column）</code> - 表中的一个字段。所有表都是由一个或多个列组成的。</li>
<li><code>行（row）</code> - 表中的一个记录。</li>
<li><code>主键（primary key）</code> - 一列（或一组列），其值能够唯一标识表中每一行。</li>
</ul>
<h3 id="SQL-语法"><a href="#SQL-语法" class="headerlink" title="SQL 语法"></a>SQL 语法</h3><p>SQL（Structured Query Language)，标准 SQL 由 ANSI 标准委员会管理，从而称为 ANSI SQL。各个 DBMS 都有自己的实现，如 PL&#x2F;SQL、Transact-SQL 等。</p>
<h4 id="SQL-语法结构"><a href="#SQL-语法结构" class="headerlink" title="SQL 语法结构"></a>SQL 语法结构</h4><p><img src="https://oss.javaguide.cn/p3-juejin/cb684d4c75fc430e92aaee226069c7da~tplv-k3u1fbpfcp-zoom-1.png" srcset="/img/loading.gif" lazyload alt="img"></p>
<p>SQL 语法结构包括：</p>
<ul>
<li><strong><code>子句</code></strong> - 是语句和查询的组成成分。（在某些情况下，这些都是可选的。）</li>
<li><strong><code>表达式</code></strong> - 可以产生任何标量值，或由列和行的数据库表</li>
<li><strong><code>谓词</code></strong> - 给需要评估的 SQL 三值逻辑（3VL）（true&#x2F;false&#x2F;unknown）或布尔真值指定条件，并限制语句和查询的效果，或改变程序流程。</li>
<li><strong><code>查询</code></strong> - 基于特定条件检索数据。这是 SQL 的一个重要组成部分。</li>
<li><strong><code>语句</code></strong> - 可以持久地影响纲要和数据，也可以控制数据库事务、程序流程、连接、会话或诊断。</li>
</ul>
<h4 id="SQL-语法要点"><a href="#SQL-语法要点" class="headerlink" title="SQL 语法要点"></a>SQL 语法要点</h4><ul>
<li><strong>SQL 语句不区分大小写</strong>，但是数据库表名、列名和值是否区分，依赖于具体的 DBMS 以及配置。例如：<code>SELECT</code> 与 <code>select</code>、<code>Select</code> 是相同的。</li>
<li><strong>多条 SQL 语句必须以分号（<code>;</code>）分隔</strong>。</li>
<li>处理 SQL 语句时，<strong>所有空格都被忽略</strong>。</li>
</ul>
<p>SQL 语句可以写成一行，也可以分写为多行。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment">-- 一行 SQL 语句</span><br><br><span class="hljs-keyword">UPDATE</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">SET</span> username<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span>, password<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span> <span class="hljs-keyword">WHERE</span> username <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;root&#x27;</span>;<br><br><span class="hljs-comment">-- 多行 SQL 语句</span><br><span class="hljs-keyword">UPDATE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">SET</span> username<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span>, password<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span><br><span class="hljs-keyword">WHERE</span> username <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;root&#x27;</span>;<br></code></pre></td></tr></table></figure>



<p>SQL 支持三种注释：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql">## 注释<span class="hljs-number">1</span><br><span class="hljs-comment">-- 注释2</span><br><span class="hljs-comment">/* 注释3 */</span><br></code></pre></td></tr></table></figure>



<h3 id="SQL-分类"><a href="#SQL-分类" class="headerlink" title="SQL 分类"></a>SQL 分类</h3><h4 id="数据定义语言（DDL）"><a href="#数据定义语言（DDL）" class="headerlink" title="数据定义语言（DDL）"></a>数据定义语言（DDL）</h4><p>数据定义语言（Data Definition Language，DDL）是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。</p>
<p>DDL 的主要功能是<strong>定义数据库对象</strong>。</p>
<p>DDL 的核心指令是 <code>CREATE</code>、<code>ALTER</code>、<code>DROP</code>。</p>
<h4 id="数据操纵语言（DML）"><a href="#数据操纵语言（DML）" class="headerlink" title="数据操纵语言（DML）"></a>数据操纵语言（DML）</h4><p>数据操纵语言（Data Manipulation Language, DML）是用于数据库操作，对数据库其中的对象和数据运行访问工作的编程语句。</p>
<p>DML 的主要功能是 <strong>访问数据</strong>，因此其语法都是以<strong>读写数据库</strong>为主。</p>
<p>DML 的核心指令是 <code>INSERT</code>、<code>UPDATE</code>、<code>DELETE</code>、<code>SELECT</code>。这四个指令合称 CRUD(Create, Read, Update, Delete)，即增删改查。</p>
<h4 id="事务控制语言（TCL）"><a href="#事务控制语言（TCL）" class="headerlink" title="事务控制语言（TCL）"></a>事务控制语言（TCL）</h4><p>事务控制语言 (Transaction Control Language, TCL) 用于<strong>管理数据库中的事务</strong>。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。</p>
<p>TCL 的核心指令是 <code>COMMIT</code>、<code>ROLLBACK</code>。</p>
<h4 id="数据控制语言（DCL）"><a href="#数据控制语言（DCL）" class="headerlink" title="#数据控制语言（DCL）"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%95%B0%E6%8D%AE%E6%8E%A7%E5%88%B6%E8%AF%AD%E8%A8%80-dcl">#</a>数据控制语言（DCL）</h4><p>数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令，它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。</p>
<p>DCL 的核心指令是 <code>GRANT</code>、<code>REVOKE</code>。</p>
<p>DCL 以<strong>控制用户的访问权限</strong>为主，因此其指令作法并不复杂，可利用 DCL 控制的权限有：<code>CONNECT</code>、<code>SELECT</code>、<code>INSERT</code>、<code>UPDATE</code>、<code>DELETE</code>、<code>EXECUTE</code>、<code>USAGE</code>、<code>REFERENCES</code>。</p>
<p>根据不同的 DBMS 以及不同的安全性实体，其支持的权限控制也有所不同。</p>
<p><strong>我们先来介绍 DML 语句用法。 DML 的主要功能是读写数据库实现增删改查。</strong></p>
<h2 id="增删改查"><a href="#增删改查" class="headerlink" title="#增删改查"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5">#</a>增删改查</h2><p>增删改查，又称为 CRUD，数据库基本操作中的基本操作。</p>
<h3 id="插入数据"><a href="#插入数据" class="headerlink" title="#插入数据"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%8F%92%E5%85%A5%E6%95%B0%E6%8D%AE">#</a>插入数据</h3><p><code>INSERT INTO</code> 语句用于向表中插入新记录。</p>
<p><strong>插入完整的行</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sql"># 插入一行<br><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">VALUES</span> (<span class="hljs-number">10</span>, <span class="hljs-string">&#x27;root&#x27;</span>, <span class="hljs-string">&#x27;root&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>);<br># 插入多行<br><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">VALUES</span> (<span class="hljs-number">10</span>, <span class="hljs-string">&#x27;root&#x27;</span>, <span class="hljs-string">&#x27;root&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>), (<span class="hljs-number">12</span>, <span class="hljs-string">&#x27;user1&#x27;</span>, <span class="hljs-string">&#x27;user1&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>), (<span class="hljs-number">18</span>, <span class="hljs-string">&#x27;user2&#x27;</span>, <span class="hljs-string">&#x27;user2&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>);<br></code></pre></td></tr></table></figure>

<p><strong>插入行的一部分</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">user</span>(username, password, email)<br><span class="hljs-keyword">VALUES</span> (<span class="hljs-string">&#x27;admin&#x27;</span>, <span class="hljs-string">&#x27;admin&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>);<br></code></pre></td></tr></table></figure>

<p><strong>插入查询出来的数据</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> <span class="hljs-keyword">user</span>(username)<br><span class="hljs-keyword">SELECT</span> name<br><span class="hljs-keyword">FROM</span> account;<br></code></pre></td></tr></table></figure>

<h3 id="更新数据"><a href="#更新数据" class="headerlink" title="#更新数据"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE">#</a>更新数据</h3><p><code>UPDATE</code> 语句用于更新表中的记录。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">UPDATE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">SET</span> username<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span>, password<span class="hljs-operator">=</span><span class="hljs-string">&#x27;robot&#x27;</span><br><span class="hljs-keyword">WHERE</span> username <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;root&#x27;</span>;<br></code></pre></td></tr></table></figure>

<h3 id="删除数据"><a href="#删除数据" class="headerlink" title="#删除数据"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE">#</a>删除数据</h3><ul>
<li><code>DELETE</code> 语句用于删除表中的记录。</li>
<li><code>TRUNCATE TABLE</code> 可以清空表，也就是删除所有行。</li>
</ul>
<p><strong>删除表中的指定数据</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">WHERE</span> username <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;robot&#x27;</span>;<br></code></pre></td></tr></table></figure>

<p><strong>清空表中的数据</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">TRUNCATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span>;<br></code></pre></td></tr></table></figure>

<h3 id="查询数据"><a href="#查询数据" class="headerlink" title="#查询数据"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE">#</a>查询数据</h3><p><code>SELECT</code> 语句用于从数据库中查询数据。</p>
<p><code>DISTINCT</code> 用于返回唯一不同的值。它作用于所有列，也就是说所有列的值都相同才算相同。</p>
<p><code>LIMIT</code> 限制返回的行数。可以有两个参数，第一个参数为起始行，从 0 开始；第二个参数为返回的总行数。</p>
<ul>
<li><code>ASC</code>：升序（默认）</li>
<li><code>DESC</code>：降序</li>
</ul>
<p><strong>查询单列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> prod_name<br><span class="hljs-keyword">FROM</span> products;<br></code></pre></td></tr></table></figure>

<p><strong>查询多列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> prod_id, prod_name, prod_price<br><span class="hljs-keyword">FROM</span> products;<br></code></pre></td></tr></table></figure>

<p><strong>查询所有列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span><br><span class="hljs-keyword">FROM</span> products;<br></code></pre></td></tr></table></figure>

<p><strong>查询不同的值</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">DISTINCT</span><br>vend_id <span class="hljs-keyword">FROM</span> products;<br></code></pre></td></tr></table></figure>

<p><strong>限制查询结果</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment">-- 返回前 5 行</span><br><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> mytable LIMIT <span class="hljs-number">5</span>;<br><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> mytable LIMIT <span class="hljs-number">0</span>, <span class="hljs-number">5</span>;<br><span class="hljs-comment">-- 返回第 3 ~ 5 行</span><br><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> mytable LIMIT <span class="hljs-number">2</span>, <span class="hljs-number">3</span>;<br></code></pre></td></tr></table></figure>

<h2 id="排序"><a href="#排序" class="headerlink" title="#排序"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%8E%92%E5%BA%8F">#</a>排序</h2><p><code>order by</code> 用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序，如果需要按照降序对记录进行排序，可以使用 <code>desc</code> 关键字。</p>
<p><code>order by</code> 对多列排序的时候，先排序的列放前面，后排序的列放后面。并且，不同的列可以有不同的排序规则。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> prod_price <span class="hljs-keyword">DESC</span>, prod_name <span class="hljs-keyword">ASC</span>;<br></code></pre></td></tr></table></figure>

<h2 id="分组"><a href="#分组" class="headerlink" title="#分组"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%86%E7%BB%84">#</a>分组</h2><p>**<code>group by</code>**：</p>
<ul>
<li><code>group by</code> 子句将记录分组到汇总行中。</li>
<li><code>group by</code> 为每个组返回一个记录。</li>
<li><code>group by</code> 通常还涉及聚合<code>count</code>，<code>max</code>，<code>sum</code>，<code>avg</code> 等。</li>
<li><code>group by</code> 可以按一列或多列进行分组。</li>
<li><code>group by</code> 按分组字段进行排序后，<code>order by</code> 可以以汇总字段来进行排序。</li>
</ul>
<p><strong>分组</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> cust_name, <span class="hljs-built_in">COUNT</span>(cust_address) <span class="hljs-keyword">AS</span> addr_num<br><span class="hljs-keyword">FROM</span> Customers <span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> cust_name;<br></code></pre></td></tr></table></figure>

<p><strong>分组后排序</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> cust_name, <span class="hljs-built_in">COUNT</span>(cust_address) <span class="hljs-keyword">AS</span> addr_num<br><span class="hljs-keyword">FROM</span> Customers <span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> cust_name<br><span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> cust_name <span class="hljs-keyword">DESC</span>;<br></code></pre></td></tr></table></figure>

<p>**<code>having</code>**：</p>
<ul>
<li><code>having</code> 用于对汇总的 <code>group by</code> 结果进行过滤。</li>
<li><code>having</code> 一般都是和 <code>group by</code> 连用。</li>
<li><code>where</code> 和 <code>having</code> 可以在相同的查询中。</li>
</ul>
<p><strong>使用 WHERE 和 HAVING 过滤数据</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> cust_name, <span class="hljs-built_in">COUNT</span>(<span class="hljs-operator">*</span>) <span class="hljs-keyword">AS</span> num<br><span class="hljs-keyword">FROM</span> Customers<br><span class="hljs-keyword">WHERE</span> cust_email <span class="hljs-keyword">IS</span> <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span><br><span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> cust_name<br><span class="hljs-keyword">HAVING</span> <span class="hljs-built_in">COUNT</span>(<span class="hljs-operator">*</span>) <span class="hljs-operator">&gt;=</span> <span class="hljs-number">1</span>;<br></code></pre></td></tr></table></figure>

<p>**<code>having</code> vs <code>where</code>**：</p>
<ul>
<li><code>where</code>：过滤过滤指定的行，后面不能加聚合函数（分组函数）。<code>where</code> 在<code>group by</code> 前。</li>
<li><code>having</code>：过滤分组，一般都是和 <code>group by</code> 连用，不能单独使用。<code>having</code> 在 <code>group by</code> 之后。</li>
</ul>
<h2 id="子查询"><a href="#子查询" class="headerlink" title="#子查询"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%AD%90%E6%9F%A5%E8%AF%A2">#</a>子查询</h2><p>子查询是嵌套在较大查询中的 SQL 查询，也称内部查询或内部选择，包含子查询的语句也称为外部查询或外部选择。简单来说，子查询就是指将一个 <code>select</code> 查询（子查询）的结果作为另一个 SQL 语句（主查询）的数据来源或者判断条件。</p>
<p>子查询可以嵌入 <code>SELECT</code>、<code>INSERT</code>、<code>UPDATE</code> 和 <code>DELETE</code> 语句中，也可以和 <code>=</code>、<code>&lt;</code>、<code>&gt;</code>、<code>IN</code>、<code>BETWEEN</code>、<code>EXISTS</code> 等运算符一起使用。</p>
<p>子查询常用在 <code>WHERE</code> 子句和 <code>FROM</code> 子句后边：</p>
<ul>
<li>当用于 <code>WHERE</code> 子句时，根据不同的运算符，子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 <code>WHERE</code> 子句查询条件的值。</li>
<li>当用于 <code>FROM</code> 子句时，一般返回多行多列数据，相当于返回一张临时表，这样才符合 <code>FROM</code> 后面是表的规则。这种做法能够实现多表联合查询。</li>
</ul>
<blockquote>
<p>  注意：MYSQL 数据库从 4.1 版本才开始支持子查询，早期版本是不支持的。</p>
</blockquote>
<p>用于 <code>WHERE</code> 子句的子查询的基本语法如下：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> column_name [, column_name ]<br><span class="hljs-keyword">from</span>   table1 [, table2 ]<br><span class="hljs-keyword">where</span>  column_name operator<br>    (<span class="hljs-keyword">select</span> column_name [, column_name ]<br>    <span class="hljs-keyword">from</span> table1 [, table2 ]<br>    [<span class="hljs-keyword">where</span>])<br></code></pre></td></tr></table></figure>

<ul>
<li>子查询需要放在括号<code>( )</code>内。</li>
<li><code>operator</code> 表示用于 where 子句的运算符。</li>
</ul>
<p>用于 <code>FROM</code> 子句的子查询的基本语法如下：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> column_name [, column_name ]<br><span class="hljs-keyword">from</span> (<span class="hljs-keyword">select</span> column_name [, column_name ]<br>      <span class="hljs-keyword">from</span> table1 [, table2 ]<br>      [<span class="hljs-keyword">where</span>]) <span class="hljs-keyword">as</span> temp_table_name<br><span class="hljs-keyword">where</span>  <span class="hljs-keyword">condition</span><br></code></pre></td></tr></table></figure>

<p>用于 <code>FROM</code> 的子查询返回的结果相当于一张临时表，所以需要使用 AS 关键字为该临时表起一个名字。</p>
<p><strong>子查询的子查询</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> cust_name, cust_contact<br><span class="hljs-keyword">FROM</span> customers<br><span class="hljs-keyword">WHERE</span> cust_id <span class="hljs-keyword">IN</span> (<span class="hljs-keyword">SELECT</span> cust_id<br>                  <span class="hljs-keyword">FROM</span> orders<br>                  <span class="hljs-keyword">WHERE</span> order_num <span class="hljs-keyword">IN</span> (<span class="hljs-keyword">SELECT</span> order_num<br>                                      <span class="hljs-keyword">FROM</span> orderitems<br>                                      <span class="hljs-keyword">WHERE</span> prod_id <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;RGAN01&#x27;</span>));<br></code></pre></td></tr></table></figure>

<p>内部查询首先在其父查询之前执行，以便可以将内部查询的结果传递给外部查询。执行过程可以参考下图：</p>
<p><img src="https://oss.javaguide.cn/p3-juejin/c439da1f5d4e4b00bdfa4316b933d764~tplv-k3u1fbpfcp-zoom-1.png" srcset="/img/loading.gif" lazyload alt="img"></p>
<h3 id="WHERE"><a href="#WHERE" class="headerlink" title="#WHERE"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#where">#</a>WHERE</h3><ul>
<li><code>WHERE</code> 子句用于过滤记录，即缩小访问数据的范围。</li>
<li><code>WHERE</code> 后跟一个返回 <code>true</code> 或 <code>false</code> 的条件。</li>
<li><code>WHERE</code> 可以与 <code>SELECT</code>，<code>UPDATE</code> 和 <code>DELETE</code> 一起使用。</li>
<li>可以在 <code>WHERE</code> 子句中使用的操作符。</li>
</ul>
<table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>&#x3D;</td>
<td>等于</td>
</tr>
<tr>
<td>&lt;&gt;</td>
<td>不等于。注释：在 SQL 的一些版本中，该操作符可被写成 !&#x3D;</td>
</tr>
<tr>
<td>&gt;</td>
<td>大于</td>
</tr>
<tr>
<td>&lt;</td>
<td>小于</td>
</tr>
<tr>
<td>&gt;&#x3D;</td>
<td>大于等于</td>
</tr>
<tr>
<td>&lt;&#x3D;</td>
<td>小于等于</td>
</tr>
<tr>
<td>BETWEEN</td>
<td>在某个范围内</td>
</tr>
<tr>
<td>LIKE</td>
<td>搜索某种模式</td>
</tr>
<tr>
<td>IN</td>
<td>指定针对某个列的多个可能值</td>
</tr>
</tbody></table>
<p><strong><code>SELECT</code> 语句中的 <code>WHERE</code> 子句</strong></p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ini">SELECT * FROM Customers<br>WHERE <span class="hljs-attr">cust_name</span> = <span class="hljs-string">&#x27;Kids Place&#x27;</span><span class="hljs-comment">;</span><br></code></pre></td></tr></table></figure>

<p><strong><code>UPDATE</code> 语句中的 <code>WHERE</code> 子句</strong></p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ini">UPDATE Customers<br>SET <span class="hljs-attr">cust_name</span> = <span class="hljs-string">&#x27;Jack Jones&#x27;</span><br>WHERE <span class="hljs-attr">cust_name</span> = <span class="hljs-string">&#x27;Kids Place&#x27;</span><span class="hljs-comment">;</span><br></code></pre></td></tr></table></figure>

<p><strong><code>DELETE</code> 语句中的 <code>WHERE</code> 子句</strong></p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs ini">DELETE FROM Customers<br>WHERE <span class="hljs-attr">cust_name</span> = <span class="hljs-string">&#x27;Kids Place&#x27;</span><span class="hljs-comment">;</span><br></code></pre></td></tr></table></figure>

<h3 id="IN-和-BETWEEN"><a href="#IN-和-BETWEEN" class="headerlink" title="#IN 和 BETWEEN"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#in-%E5%92%8C-between">#</a>IN 和 BETWEEN</h3><ul>
<li><code>IN</code> 操作符在 <code>WHERE</code> 子句中使用，作用是在指定的几个特定值中任选一个值。</li>
<li><code>BETWEEN</code> 操作符在 <code>WHERE</code> 子句中使用，作用是选取介于某个范围内的值。</li>
</ul>
<p><strong>IN 示例</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span><br><span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">WHERE</span> vend_id <span class="hljs-keyword">IN</span> (<span class="hljs-string">&#x27;DLL01&#x27;</span>, <span class="hljs-string">&#x27;BRS01&#x27;</span>);<br></code></pre></td></tr></table></figure>

<p><strong>BETWEEN 示例</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span><br><span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">WHERE</span> prod_price <span class="hljs-keyword">BETWEEN</span> <span class="hljs-number">3</span> <span class="hljs-keyword">AND</span> <span class="hljs-number">5</span>;<br></code></pre></td></tr></table></figure>

<h3 id="AND、OR、NOT"><a href="#AND、OR、NOT" class="headerlink" title="#AND、OR、NOT"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#and%E3%80%81or%E3%80%81not">#</a>AND、OR、NOT</h3><ul>
<li><code>AND</code>、<code>OR</code>、<code>NOT</code> 是用于对过滤条件的逻辑处理指令。</li>
<li><code>AND</code> 优先级高于 <code>OR</code>，为了明确处理顺序，可以使用 <code>()</code>。</li>
<li><code>AND</code> 操作符表示左右条件都要满足。</li>
<li><code>OR</code> 操作符表示左右条件满足任意一个即可。</li>
<li><code>NOT</code> 操作符用于否定一个条件。</li>
</ul>
<p><strong>AND 示例</strong></p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ini">SELECT prod_id, prod_name, prod_price<br>FROM products<br>WHERE <span class="hljs-attr">vend_id</span> = <span class="hljs-string">&#x27;DLL01&#x27;</span> AND prod_price &lt;= <span class="hljs-number">4</span><span class="hljs-comment">;</span><br></code></pre></td></tr></table></figure>

<p><strong>OR 示例</strong></p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs ini">SELECT prod_id, prod_name, prod_price<br>FROM products<br>WHERE <span class="hljs-attr">vend_id</span> = <span class="hljs-string">&#x27;DLL01&#x27;</span> OR vend_id = <span class="hljs-string">&#x27;BRS01&#x27;</span><span class="hljs-comment">;</span><br></code></pre></td></tr></table></figure>

<p><strong>NOT 示例</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span><br><span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">WHERE</span> prod_price <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">BETWEEN</span> <span class="hljs-number">3</span> <span class="hljs-keyword">AND</span> <span class="hljs-number">5</span>;<br></code></pre></td></tr></table></figure>

<h3 id="LIKE"><a href="#LIKE" class="headerlink" title="#LIKE"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#like">#</a>LIKE</h3><ul>
<li><code>LIKE</code> 操作符在 <code>WHERE</code> 子句中使用，作用是确定字符串是否匹配模式。</li>
<li>只有字段是文本值时才使用 <code>LIKE</code>。</li>
<li><code>LIKE</code> 支持两个通配符匹配选项：<code>%</code> 和 <code>_</code>。</li>
<li>不要滥用通配符，通配符位于开头处匹配会非常慢。</li>
<li><code>%</code> 表示任何字符出现任意次数。</li>
<li><code>_</code> 表示任何字符出现一次。</li>
</ul>
<p><strong>% 示例</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> prod_id, prod_name, prod_price<br><span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">WHERE</span> prod_name <span class="hljs-keyword">LIKE</span> <span class="hljs-string">&#x27;%bean bag%&#x27;</span>;<br></code></pre></td></tr></table></figure>

<p><strong>_ 示例</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> prod_id, prod_name, prod_price<br><span class="hljs-keyword">FROM</span> products<br><span class="hljs-keyword">WHERE</span> prod_name <span class="hljs-keyword">LIKE</span> <span class="hljs-string">&#x27;__ inch teddy bear&#x27;</span>;<br></code></pre></td></tr></table></figure>

<h2 id="连接"><a href="#连接" class="headerlink" title="#连接"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E8%BF%9E%E6%8E%A5">#</a>连接</h2><p>JOIN 是“连接”的意思，顾名思义，SQL JOIN 子句用于将两个或者多个表联合起来进行查询。</p>
<p>连接表时需要在每个表中选择一个字段，并对这些字段的值进行比较，值相同的两条记录将合并为一条。<strong>连接表的本质就是将不同表的记录合并起来，形成一张新表。当然，这张新表只是临时的，它仅存在于本次查询期间</strong>。</p>
<p>使用 <code>JOIN</code> 连接两个表的基本语法如下：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> table1.column1, table2.column2...<br><span class="hljs-keyword">from</span> table1<br><span class="hljs-keyword">join</span> table2<br><span class="hljs-keyword">on</span> table1.common_column1 <span class="hljs-operator">=</span> table2.common_column2;<br></code></pre></td></tr></table></figure>

<p><code>table1.common_column1 = table2.common_column2</code> 是连接条件，只有满足此条件的记录才会合并为一行。您可以使用多个运算符来连接表，例如 &#x3D;、&gt;、&lt;、&lt;&gt;、&lt;&#x3D;、&gt;&#x3D;、!&#x3D;、<code>between</code>、<code>like</code> 或者 <code>not</code>，但是最常见的是使用 &#x3D;。</p>
<p>当两个表中有同名的字段时，为了帮助数据库引擎区分是哪个表的字段，在书写同名字段名时需要加上表名。当然，如果书写的字段名在两个表中是唯一的，也可以不使用以上格式，只写字段名即可。</p>
<p>另外，如果两张表的关联字段名相同，也可以使用 <code>USING</code>子句来代替 <code>ON</code>，举个例子：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs sql"># join....on<br><span class="hljs-keyword">select</span> c.cust_name, o.order_num<br><span class="hljs-keyword">from</span> Customers c<br><span class="hljs-keyword">inner</span> <span class="hljs-keyword">join</span> Orders o<br><span class="hljs-keyword">on</span> c.cust_id <span class="hljs-operator">=</span> o.cust_id<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> c.cust_name;<br><br># 如果两张表的关联字段名相同，也可以使用<span class="hljs-keyword">USING</span>子句：join....using()<br><span class="hljs-keyword">select</span> c.cust_name, o.order_num<br><span class="hljs-keyword">from</span> Customers c<br><span class="hljs-keyword">inner</span> <span class="hljs-keyword">join</span> Orders o<br><span class="hljs-keyword">using</span>(cust_id)<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> c.cust_name;<br></code></pre></td></tr></table></figure>

<p><strong><code>ON</code> 和 <code>WHERE</code> 的区别</strong>：</p>
<ul>
<li>连接表时，SQL 会根据连接条件生成一张新的临时表。<code>ON</code> 就是连接条件，它决定临时表的生成。</li>
<li><code>WHERE</code> 是在临时表生成以后，再对临时表中的数据进行过滤，生成最终的结果集，这个时候已经没有 JOIN-ON 了。</li>
</ul>
<p>所以总结来说就是：<strong>SQL 先根据 ON 生成一张临时表，然后再根据 WHERE 对临时表进行筛选</strong>。</p>
<p>SQL 允许在 <code>JOIN</code> 左边加上一些修饰性的关键词，从而形成不同类型的连接，如下表所示：</p>
<table>
<thead>
<tr>
<th>连接类型</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>INNER JOIN 内连接</td>
<td>（默认连接方式）只有当两个表都存在满足条件的记录时才会返回行。</td>
</tr>
<tr>
<td>LEFT JOIN &#x2F; LEFT OUTER JOIN 左(外)连接</td>
<td>返回左表中的所有行，即使右表中没有满足条件的行也是如此。</td>
</tr>
<tr>
<td>RIGHT JOIN &#x2F; RIGHT OUTER JOIN 右(外)连接</td>
<td>返回右表中的所有行，即使左表中没有满足条件的行也是如此。</td>
</tr>
<tr>
<td>FULL JOIN &#x2F; FULL OUTER JOIN 全(外)连接</td>
<td>只要其中有一个表存在满足条件的记录，就返回行。</td>
</tr>
<tr>
<td>SELF JOIN</td>
<td>将一个表连接到自身，就像该表是两个表一样。为了区分两个表，在 SQL 语句中需要至少重命名一个表。</td>
</tr>
<tr>
<td>CROSS JOIN</td>
<td>交叉连接，从两个或者多个连接表中返回记录集的笛卡尔积。</td>
</tr>
</tbody></table>
<p>下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。</p>
<p><img src="https://oss.javaguide.cn/p3-juejin/701670942f0f45d3a3a2187cd04a12ad~tplv-k3u1fbpfcp-zoom-1.png" srcset="/img/loading.gif" lazyload alt="img"></p>
<p>如果不加任何修饰词，只写 <code>JOIN</code>，那么默认为 <code>INNER JOIN</code></p>
<p>对于 <code>INNER JOIN</code> 来说，还有一种隐式的写法，称为 “<strong>隐式内连接</strong>”，也就是没有 <code>INNER JOIN</code> 关键字，使用 <code>WHERE</code> 语句实现内连接的功能</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs sql"># 隐式内连接<br><span class="hljs-keyword">select</span> c.cust_name, o.order_num<br><span class="hljs-keyword">from</span> Customers c, Orders o<br><span class="hljs-keyword">where</span> c.cust_id <span class="hljs-operator">=</span> o.cust_id<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> c.cust_name;<br><br># 显式内连接<br><span class="hljs-keyword">select</span> c.cust_name, o.order_num<br><span class="hljs-keyword">from</span> Customers c <span class="hljs-keyword">inner</span> <span class="hljs-keyword">join</span> Orders o<br><span class="hljs-keyword">using</span>(cust_id)<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> c.cust_name;<br></code></pre></td></tr></table></figure>

<h2 id="组合"><a href="#组合" class="headerlink" title="#组合"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E7%BB%84%E5%90%88">#</a>组合</h2><p><code>UNION</code> 运算符将两个或更多查询的结果组合起来，并生成一个结果集，其中包含来自 <code>UNION</code> 中参与查询的提取行。</p>
<p><code>UNION</code> 基本规则：</p>
<ul>
<li>所有查询的列数和列顺序必须相同。</li>
<li>每个查询中涉及表的列的数据类型必须相同或兼容。</li>
<li>通常返回的列名取自第一个查询。</li>
</ul>
<p>默认地，<code>UNION</code> 操作符选取不同的值。如果允许重复的值，请使用 <code>UNION ALL</code>。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> column_name(s) <span class="hljs-keyword">FROM</span> table1<br><span class="hljs-keyword">UNION</span> <span class="hljs-keyword">ALL</span><br><span class="hljs-keyword">SELECT</span> column_name(s) <span class="hljs-keyword">FROM</span> table2;<br></code></pre></td></tr></table></figure>

<p><code>UNION</code> 结果集中的列名总是等于 <code>UNION</code> 中第一个 <code>SELECT</code> 语句中的列名。</p>
<p><code>JOIN</code> vs <code>UNION</code>：</p>
<ul>
<li><code>JOIN</code> 中连接表的列可能不同，但在 <code>UNION</code> 中，所有查询的列数和列顺序必须相同。</li>
<li><code>UNION</code> 将查询之后的行放在一起（垂直放置），但 <code>JOIN</code> 将查询之后的列放在一起（水平放置），即它构成一个笛卡尔积。</li>
</ul>
<h2 id="函数"><a href="#函数" class="headerlink" title="#函数"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%87%BD%E6%95%B0">#</a>函数</h2><p>不同数据库的函数往往各不相同，因此不可移植。本节主要以 MySQL 的函数为例。</p>
<h3 id="文本处理"><a href="#文本处理" class="headerlink" title="#文本处理"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86">#</a>文本处理</h3><table>
<thead>
<tr>
<th>函数</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>LEFT()</code>、<code>RIGHT()</code></td>
<td>左边或者右边的字符</td>
</tr>
<tr>
<td><code>LOWER()</code>、<code>UPPER()</code></td>
<td>转换为小写或者大写</td>
</tr>
<tr>
<td><code>LTRIM()</code>、<code>RTRIM()</code></td>
<td>去除左边或者右边的空格</td>
</tr>
<tr>
<td><code>LENGTH()</code></td>
<td>长度，以字节为单位</td>
</tr>
<tr>
<td><code>SOUNDEX()</code></td>
<td>转换为语音值</td>
</tr>
</tbody></table>
<p>其中， <strong><code>SOUNDEX()</code></strong> 可以将一个字符串转换为描述其语音表示的字母数字模式。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span><br><span class="hljs-keyword">FROM</span> mytable<br><span class="hljs-keyword">WHERE</span> SOUNDEX(col1) <span class="hljs-operator">=</span> SOUNDEX(<span class="hljs-string">&#x27;apple&#x27;</span>)<br></code></pre></td></tr></table></figure>

<h3 id="日期和时间处理"><a href="#日期和时间处理" class="headerlink" title="#日期和时间处理"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%97%A5%E6%9C%9F%E5%92%8C%E6%97%B6%E9%97%B4%E5%A4%84%E7%90%86">#</a>日期和时间处理</h3><ul>
<li>日期格式：<code>YYYY-MM-DD</code></li>
<li>时间格式：<code>HH:MM:SS</code></li>
</ul>
<table>
<thead>
<tr>
<th>函 数</th>
<th>说 明</th>
</tr>
</thead>
<tbody><tr>
<td><code>AddDate()</code></td>
<td>增加一个日期（天、周等）</td>
</tr>
<tr>
<td><code>AddTime()</code></td>
<td>增加一个时间（时、分等）</td>
</tr>
<tr>
<td><code>CurDate()</code></td>
<td>返回当前日期</td>
</tr>
<tr>
<td><code>CurTime()</code></td>
<td>返回当前时间</td>
</tr>
<tr>
<td><code>Date()</code></td>
<td>返回日期时间的日期部分</td>
</tr>
<tr>
<td><code>DateDiff()</code></td>
<td>计算两个日期之差</td>
</tr>
<tr>
<td><code>Date_Add()</code></td>
<td>高度灵活的日期运算函数</td>
</tr>
<tr>
<td><code>Date_Format()</code></td>
<td>返回一个格式化的日期或时间串</td>
</tr>
<tr>
<td><code>Day()</code></td>
<td>返回一个日期的天数部分</td>
</tr>
<tr>
<td><code>DayOfWeek()</code></td>
<td>对于一个日期，返回对应的星期几</td>
</tr>
<tr>
<td><code>Hour()</code></td>
<td>返回一个时间的小时部分</td>
</tr>
<tr>
<td><code>Minute()</code></td>
<td>返回一个时间的分钟部分</td>
</tr>
<tr>
<td><code>Month()</code></td>
<td>返回一个日期的月份部分</td>
</tr>
<tr>
<td><code>Now()</code></td>
<td>返回当前日期和时间</td>
</tr>
<tr>
<td><code>Second()</code></td>
<td>返回一个时间的秒部分</td>
</tr>
<tr>
<td><code>Time()</code></td>
<td>返回一个日期时间的时间部分</td>
</tr>
<tr>
<td><code>Year()</code></td>
<td>返回一个日期的年份部分</td>
</tr>
</tbody></table>
<h3 id="数值处理"><a href="#数值处理" class="headerlink" title="#数值处理"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%95%B0%E5%80%BC%E5%A4%84%E7%90%86">#</a>数值处理</h3><table>
<thead>
<tr>
<th>函数</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>SIN()</td>
<td>正弦</td>
</tr>
<tr>
<td>COS()</td>
<td>余弦</td>
</tr>
<tr>
<td>TAN()</td>
<td>正切</td>
</tr>
<tr>
<td>ABS()</td>
<td>绝对值</td>
</tr>
<tr>
<td>SQRT()</td>
<td>平方根</td>
</tr>
<tr>
<td>MOD()</td>
<td>余数</td>
</tr>
<tr>
<td>EXP()</td>
<td>指数</td>
</tr>
<tr>
<td>PI()</td>
<td>圆周率</td>
</tr>
<tr>
<td>RAND()</td>
<td>随机数</td>
</tr>
</tbody></table>
<h3 id="汇总"><a href="#汇总" class="headerlink" title="#汇总"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%B1%87%E6%80%BB">#</a>汇总</h3><table>
<thead>
<tr>
<th>函 数</th>
<th>说 明</th>
</tr>
</thead>
<tbody><tr>
<td><code>AVG()</code></td>
<td>返回某列的平均值</td>
</tr>
<tr>
<td><code>COUNT()</code></td>
<td>返回某列的行数</td>
</tr>
<tr>
<td><code>MAX()</code></td>
<td>返回某列的最大值</td>
</tr>
<tr>
<td><code>MIN()</code></td>
<td>返回某列的最小值</td>
</tr>
<tr>
<td><code>SUM()</code></td>
<td>返回某列值之和</td>
</tr>
</tbody></table>
<p><code>AVG()</code> 会忽略 NULL 行。</p>
<p>使用 <code>DISTINCT</code> 可以让汇总函数值汇总不同的值。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-built_in">AVG</span>(<span class="hljs-keyword">DISTINCT</span> col1) <span class="hljs-keyword">AS</span> avg_col<br><span class="hljs-keyword">FROM</span> mytable<br></code></pre></td></tr></table></figure>

<p><strong>接下来，我们来介绍 DDL 语句用法。DDL 的主要功能是定义数据库对象（如：数据库、数据表、视图、索引等）</strong></p>
<h2 id="数据定义"><a href="#数据定义" class="headerlink" title="#数据定义"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%95%B0%E6%8D%AE%E5%AE%9A%E4%B9%89">#</a>数据定义</h2><h3 id="数据库（DATABASE）"><a href="#数据库（DATABASE）" class="headerlink" title="#数据库（DATABASE）"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%95%B0%E6%8D%AE%E5%BA%93-database">#</a>数据库（DATABASE）</h3><h4 id="创建数据库"><a href="#创建数据库" class="headerlink" title="#创建数据库"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93">#</a>创建数据库</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> DATABASE test;<br></code></pre></td></tr></table></figure>

<h4 id="删除数据库"><a href="#删除数据库" class="headerlink" title="#删除数据库"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE%E5%BA%93">#</a>删除数据库</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> DATABASE test;<br></code></pre></td></tr></table></figure>

<h4 id="选择数据库"><a href="#选择数据库" class="headerlink" title="#选择数据库"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93">#</a>选择数据库</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql">USE test;<br></code></pre></td></tr></table></figure>

<h3 id="数据表（TABLE）"><a href="#数据表（TABLE）" class="headerlink" title="#数据表（TABLE）"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%95%B0%E6%8D%AE%E8%A1%A8-table">#</a>数据表（TABLE）</h3><h4 id="创建数据表"><a href="#创建数据表" class="headerlink" title="#创建数据表"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E8%A1%A8">#</a>创建数据表</h4><p><strong>普通创建</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span> (<br>  id <span class="hljs-type">int</span>(<span class="hljs-number">10</span>) unsigned <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> COMMENT <span class="hljs-string">&#x27;Id&#x27;</span>,<br>  username <span class="hljs-type">varchar</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;用户名&#x27;</span>,<br>  password <span class="hljs-type">varchar</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;密码&#x27;</span>,<br>  email <span class="hljs-type">varchar</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;邮箱&#x27;</span><br>) COMMENT<span class="hljs-operator">=</span><span class="hljs-string">&#x27;用户表&#x27;</span>;<br></code></pre></td></tr></table></figure>

<p><strong>根据已有的表创建新表</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> vip_user <span class="hljs-keyword">AS</span><br><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span>;<br></code></pre></td></tr></table></figure>

<h4 id="删除数据表"><a href="#删除数据表" class="headerlink" title="#删除数据表"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE%E8%A1%A8">#</a>删除数据表</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span>;<br></code></pre></td></tr></table></figure>

<h4 id="修改数据表"><a href="#修改数据表" class="headerlink" title="#修改数据表"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E4%BF%AE%E6%94%B9%E6%95%B0%E6%8D%AE%E8%A1%A8">#</a>修改数据表</h4><p><strong>添加列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">ADD</span> age <span class="hljs-type">int</span>(<span class="hljs-number">3</span>);<br></code></pre></td></tr></table></figure>

<p><strong>删除列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">COLUMN</span> age;<br></code></pre></td></tr></table></figure>

<p><strong>修改列</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> `<span class="hljs-keyword">user</span>`<br>MODIFY <span class="hljs-keyword">COLUMN</span> age tinyint;<br></code></pre></td></tr></table></figure>

<p><strong>添加主键</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">ADD</span> <span class="hljs-keyword">PRIMARY</span> KEY (id);<br></code></pre></td></tr></table></figure>

<p><strong>删除主键</strong></p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">PRIMARY</span> KEY;<br></code></pre></td></tr></table></figure>

<h3 id="视图（VIEW）"><a href="#视图（VIEW）" class="headerlink" title="#视图（VIEW）"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E8%A7%86%E5%9B%BE-view">#</a>视图（VIEW）</h3><p>定义：</p>
<ul>
<li>视图是基于 SQL 语句的结果集的可视化的表。</li>
<li>视图是虚拟的表，本身不包含数据，也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。</li>
</ul>
<p>作用：</p>
<ul>
<li>简化复杂的 SQL 操作，比如复杂的联结；</li>
<li>只使用实际表的一部分数据；</li>
<li>通过只给用户访问视图的权限，保证数据的安全性；</li>
<li>更改数据格式和表示。</li>
</ul>
<p><img src="https://oss.javaguide.cn/p3-juejin/ec4c975296ea4a7097879dac7c353878~tplv-k3u1fbpfcp-zoom-1.jpeg" srcset="/img/loading.gif" lazyload alt="mysql视图">mysql视图</p>
<h4 id="创建视图"><a href="#创建视图" class="headerlink" title="#创建视图"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E8%A7%86%E5%9B%BE">#</a>创建视图</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">VIEW</span> top_10_user_view <span class="hljs-keyword">AS</span><br><span class="hljs-keyword">SELECT</span> id, username<br><span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">WHERE</span> id <span class="hljs-operator">&lt;</span> <span class="hljs-number">10</span>;<br></code></pre></td></tr></table></figure>

<h4 id="删除视图"><a href="#删除视图" class="headerlink" title="#删除视图"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E8%A7%86%E5%9B%BE">#</a>删除视图</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">VIEW</span> top_10_user_view;<br></code></pre></td></tr></table></figure>

<h3 id="索引（INDEX）"><a href="#索引（INDEX）" class="headerlink" title="#索引（INDEX）"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E7%B4%A2%E5%BC%95-index">#</a>索引（INDEX）</h3><p><strong>索引是一种用于快速查询和检索数据的数据结构，其本质可以看成是一种排序好的数据结构。</strong></p>
<p>索引的作用就相当于书的目录。打个比方: 我们在查字典的时候，如果没有目录，那我们就只能一页一页的去找我们需要查的那个字，速度很慢。如果有目录了，我们只需要先去目录里查找字的位置，然后直接翻到那一页就行了。</p>
<p><strong>优点</strong>：</p>
<ul>
<li>使用索引可以大大加快 数据的检索速度（大大减少检索的数据量）, 这也是创建索引的最主要的原因。</li>
<li>通过创建唯一性索引，可以保证数据库表中每一行数据的唯一性。</li>
</ul>
<p><strong>缺点</strong>：</p>
<ul>
<li>创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候，如果数据有索引，那么索引也需要动态的修改，会降低 SQL 执行效率。</li>
<li>索引需要使用物理文件存储，也会耗费一定空间。</li>
</ul>
<p>但是，<strong>使用索引一定能提高查询性能吗?</strong></p>
<p>大多数情况下，索引查询都是比全表扫描要快的。但是如果数据库的数据量不大，那么使用索引也不一定能够带来很大提升。</p>
<p>关于索引的详细介绍，请看我写的 <a target="_blank" rel="noopener" href="https://javaguide.cn/database/mysql/mysql-index.html">MySQL 索引详解open in new window</a> 这篇文章。</p>
<h4 id="创建索引"><a href="#创建索引" class="headerlink" title="#创建索引"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95">#</a>创建索引</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> INDEX user_index<br><span class="hljs-keyword">ON</span> <span class="hljs-keyword">user</span> (id);<br></code></pre></td></tr></table></figure>

<h4 id="添加索引"><a href="#添加索引" class="headerlink" title="#添加索引"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%B7%BB%E5%8A%A0%E7%B4%A2%E5%BC%95">#</a>添加索引</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">table</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">ADD</span> INDEX user_index(id)<br></code></pre></td></tr></table></figure>

<h4 id="创建唯一索引"><a href="#创建唯一索引" class="headerlink" title="#创建唯一索引"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95">#</a>创建唯一索引</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">UNIQUE</span> INDEX user_index<br><span class="hljs-keyword">ON</span> <span class="hljs-keyword">user</span> (id);<br></code></pre></td></tr></table></figure>

<h4 id="删除索引"><a href="#删除索引" class="headerlink" title="#删除索引"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E7%B4%A2%E5%BC%95">#</a>删除索引</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">ALTER</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">user</span><br><span class="hljs-keyword">DROP</span> INDEX user_index;<br></code></pre></td></tr></table></figure>

<h3 id="约束"><a href="#约束" class="headerlink" title="#约束"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E7%BA%A6%E6%9D%9F">#</a>约束</h3><p>SQL 约束用于规定表中的数据规则。</p>
<p>如果存在违反约束的数据行为，行为会被约束终止。</p>
<p>约束可以在创建表时规定（通过 CREATE TABLE 语句），或者在表创建之后规定（通过 ALTER TABLE 语句）。</p>
<p>约束类型：</p>
<ul>
<li><code>NOT NULL</code> - 指示某列不能存储 NULL 值。</li>
<li><code>UNIQUE</code> - 保证某列的每行必须有唯一的值。</li>
<li><code>PRIMARY KEY</code> - NOT NULL 和 UNIQUE 的结合。确保某列（或两个列多个列的结合）有唯一标识，有助于更容易更快速地找到表中的一个特定的记录。</li>
<li><code>FOREIGN KEY</code> - 保证一个表中的数据匹配另一个表中的值的参照完整性。</li>
<li><code>CHECK</code> - 保证列中的值符合指定的条件。</li>
<li><code>DEFAULT</code> - 规定没有给列赋值时的默认值。</li>
</ul>
<p>创建表时使用约束条件：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> Users (<br>  Id <span class="hljs-type">INT</span>(<span class="hljs-number">10</span>) UNSIGNED <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> AUTO_INCREMENT COMMENT <span class="hljs-string">&#x27;自增Id&#x27;</span>,<br>  Username <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">UNIQUE</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;用户名&#x27;</span>,<br>  Password <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;密码&#x27;</span>,<br>  Email <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">64</span>) <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">NULL</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">&#x27;default&#x27;</span> COMMENT <span class="hljs-string">&#x27;邮箱地址&#x27;</span>,<br>  Enabled TINYINT(<span class="hljs-number">4</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">NULL</span> COMMENT <span class="hljs-string">&#x27;是否有效&#x27;</span>,<br>  <span class="hljs-keyword">PRIMARY</span> KEY (Id)<br>) ENGINE<span class="hljs-operator">=</span>InnoDB AUTO_INCREMENT<span class="hljs-operator">=</span><span class="hljs-number">2</span> <span class="hljs-keyword">DEFAULT</span> CHARSET<span class="hljs-operator">=</span>utf8mb4 COMMENT<span class="hljs-operator">=</span><span class="hljs-string">&#x27;用户表&#x27;</span>;<br></code></pre></td></tr></table></figure>

<p><strong>接下来，我们来介绍 TCL 语句用法。TCL 的主要功能是管理数据库中的事务。</strong></p>
<h2 id="事务处理"><a href="#事务处理" class="headerlink" title="#事务处理"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86">#</a>事务处理</h2><p>不能回退 <code>SELECT</code> 语句，回退 <code>SELECT</code> 语句也没意义；也不能回退 <code>CREATE</code> 和 <code>DROP</code> 语句。</p>
<p><strong>MySQL 默认是隐式提交</strong>，每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 <code>START TRANSACTION</code> 语句时，会关闭隐式提交；当 <code>COMMIT</code> 或 <code>ROLLBACK</code> 语句执行后，事务会自动关闭，重新恢复隐式提交。</p>
<p>通过 <code>set autocommit=0</code> 可以取消自动提交，直到 <code>set autocommit=1</code> 才会提交；<code>autocommit</code> 标记是针对每个连接而不是针对服务器的。</p>
<p>指令：</p>
<ul>
<li><code>START TRANSACTION</code> - 指令用于标记事务的起始点。</li>
<li><code>SAVEPOINT</code> - 指令用于创建保留点。</li>
<li><code>ROLLBACK TO</code> - 指令用于回滚到指定的保留点；如果没有设置保留点，则回退到 <code>START TRANSACTION</code> 语句处。</li>
<li><code>COMMIT</code> - 提交事务。</li>
</ul>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment">-- 开始事务</span><br><span class="hljs-keyword">START</span> TRANSACTION;<br><br><span class="hljs-comment">-- 插入操作 A</span><br><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> `<span class="hljs-keyword">user</span>`<br><span class="hljs-keyword">VALUES</span> (<span class="hljs-number">1</span>, <span class="hljs-string">&#x27;root1&#x27;</span>, <span class="hljs-string">&#x27;root1&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>);<br><br><span class="hljs-comment">-- 创建保留点 updateA</span><br><span class="hljs-keyword">SAVEPOINT</span> updateA;<br><br><span class="hljs-comment">-- 插入操作 B</span><br><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> `<span class="hljs-keyword">user</span>`<br><span class="hljs-keyword">VALUES</span> (<span class="hljs-number">2</span>, <span class="hljs-string">&#x27;root2&#x27;</span>, <span class="hljs-string">&#x27;root2&#x27;</span>, <span class="hljs-string">&#x27;xxxx@163.com&#x27;</span>);<br><br><span class="hljs-comment">-- 回滚到保留点 updateA</span><br><span class="hljs-keyword">ROLLBACK</span> <span class="hljs-keyword">TO</span> updateA;<br><br><span class="hljs-comment">-- 提交事务，只有操作 A 生效</span><br><span class="hljs-keyword">COMMIT</span>;<br></code></pre></td></tr></table></figure>

<p><strong>接下来，我们来介绍 DCL 语句用法。DCL 的主要功能是控制用户的访问权限。</strong></p>
<h2 id="权限控制"><a href="#权限控制" class="headerlink" title="#权限控制"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6">#</a>权限控制</h2><p>要授予用户帐户权限，可以用<code>GRANT</code>命令。有撤销用户的权限，可以用<code>REVOKE</code>命令。这里以 MySQl 为例，介绍权限控制实际应用。</p>
<p><code>GRANT</code>授予权限语法：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">GRANT</span> privilege,[privilege],.. <span class="hljs-keyword">ON</span> privilege_level<br><span class="hljs-keyword">TO</span> <span class="hljs-keyword">user</span> [IDENTIFIED <span class="hljs-keyword">BY</span> password]<br>[REQUIRE tsl_option]<br>[<span class="hljs-keyword">WITH</span> [GRANT_OPTION <span class="hljs-operator">|</span> resource_option]];<br></code></pre></td></tr></table></figure>

<p>简单解释一下：</p>
<ol>
<li>在<code>GRANT</code>关键字后指定一个或多个权限。如果授予用户多个权限，则每个权限由逗号分隔。</li>
<li><code>ON privilege_level</code> 确定权限应用级别。MySQL 支持 global（<code>*.*</code>），database（<code>database.*</code>），table（<code>database.table</code>）和列级别。如果使用列权限级别，则必须在每个权限之后指定一个或逗号分隔列的列表。</li>
<li><code>user</code> 是要授予权限的用户。如果用户已存在，则<code>GRANT</code>语句将修改其权限。否则，<code>GRANT</code>语句将创建一个新用户。可选子句<code>IDENTIFIED BY</code>允许您为用户设置新的密码。</li>
<li><code>REQUIRE tsl_option</code>指定用户是否必须通过 SSL，X059 等安全连接连接到数据库服务器。</li>
<li>可选 <code>WITH GRANT OPTION</code> 子句允许您授予其他用户或从其他用户中删除您拥有的权限。此外，您可以使用<code>WITH</code>子句分配 MySQL 数据库服务器的资源，例如，设置用户每小时可以使用的连接数或语句数。这在 MySQL 共享托管等共享环境中非常有用。</li>
</ol>
<p><code>REVOKE</code> 撤销权限语法：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">REVOKE</span>   privilege_type [(column_list)]<br>        [, priv_type [(column_list)]]...<br><span class="hljs-keyword">ON</span> [object_type] privilege_level<br><span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span> [, <span class="hljs-keyword">user</span>]...<br></code></pre></td></tr></table></figure>

<p>简单解释一下：</p>
<ol>
<li>在 <code>REVOKE</code> 关键字后面指定要从用户撤消的权限列表。您需要用逗号分隔权限。</li>
<li>指定在 <code>ON</code> 子句中撤销特权的特权级别。</li>
<li>指定要撤消 <code>FROM</code> 子句中的权限的用户帐户。</li>
</ol>
<p><code>GRANT</code> 和 <code>REVOKE</code> 可在几个层次上控制访问权限：</p>
<ul>
<li>整个服务器，使用 <code>GRANT ALL</code> 和 <code>REVOKE ALL</code>；</li>
<li>整个数据库，使用 <code>ON database.*</code>；</li>
<li>特定的表，使用 <code>ON database.table</code>；</li>
<li>特定的列；</li>
<li>特定的存储过程。</li>
</ul>
<p>新创建的账户没有任何权限。账户用 <code>username@host</code> 的形式定义，<code>username@%</code> 使用的是默认主机名。MySQL 的账户信息保存在 mysql 这个数据库中。</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql">USE mysql;<br><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span>;<br></code></pre></td></tr></table></figure>

<p>下表说明了可用于<code>GRANT</code>和<code>REVOKE</code>语句的所有允许权限：</p>
<table>
<thead>
<tr>
<th><strong>特权</strong></th>
<th><strong>说明</strong></th>
<th><strong>级别</strong></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td><strong>全局</strong></td>
<td>数据库</td>
<td><strong>表</strong></td>
<td><strong>列</strong></td>
<td><strong>程序</strong></td>
<td><strong>代理</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ALL [PRIVILEGES]</td>
<td>授予除 GRANT OPTION 之外的指定访问级别的所有权限</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ALTER</td>
<td>允许用户使用 ALTER TABLE 语句</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>ALTER ROUTINE</td>
<td>允许用户更改或删除存储的例程</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td>X</td>
<td></td>
</tr>
<tr>
<td>CREATE</td>
<td>允许用户创建数据库和表</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CREATE ROUTINE</td>
<td>允许用户创建存储的例程</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CREATE TABLESPACE</td>
<td>允许用户创建，更改或删除表空间和日志文件组</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CREATE TEMPORARY TABLES</td>
<td>允许用户使用 CREATE TEMPORARY TABLE 创建临时表</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CREATE USER</td>
<td>允许用户使用 CREATE USER，DROP USER，RENAME USER 和 REVOKE ALL PRIVILEGES 语句。</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CREATE VIEW</td>
<td>允许用户创建或修改视图。</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>DELETE</td>
<td>允许用户使用 DELETE</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>DROP</td>
<td>允许用户删除数据库，表和视图</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>EVENT</td>
<td>启用事件计划程序的事件使用。</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>EXECUTE</td>
<td>允许用户执行存储的例程</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>FILE</td>
<td>允许用户读取数据库目录中的任何文件。</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>GRANT OPTION</td>
<td>允许用户拥有授予或撤消其他帐户权限的权限。</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td>X</td>
<td>X</td>
</tr>
<tr>
<td>INDEX</td>
<td>允许用户创建或删除索引。</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>INSERT</td>
<td>允许用户使用 INSERT 语句</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
</tr>
<tr>
<td>LOCK TABLES</td>
<td>允许用户对具有 SELECT 权限的表使用 LOCK TABLES</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PROCESS</td>
<td>允许用户使用 SHOW PROCESSLIST 语句查看所有进程。</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PROXY</td>
<td>启用用户代理。</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>REFERENCES</td>
<td>允许用户创建外键</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
</tr>
<tr>
<td>RELOAD</td>
<td>允许用户使用 FLUSH 操作</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>REPLICATION CLIENT</td>
<td>允许用户查询以查看主服务器或从属服务器的位置</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>REPLICATION SLAVE</td>
<td>允许用户使用复制从属从主服务器读取二进制日志事件。</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SELECT</td>
<td>允许用户使用 SELECT 语句</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
</tr>
<tr>
<td>SHOW DATABASES</td>
<td>允许用户显示所有数据库</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SHOW VIEW</td>
<td>允许用户使用 SHOW CREATE VIEW 语句</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SHUTDOWN</td>
<td>允许用户使用 mysqladmin shutdown 命令</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SUPER</td>
<td>允许用户使用其他管理操作，例如 CHANGE MASTER TO，KILL，PURGE BINARY LOGS，SET GLOBAL 和 mysqladmin 命令</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>TRIGGER</td>
<td>允许用户使用 TRIGGER 操作。</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>UPDATE</td>
<td>允许用户使用 UPDATE 语句</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td>X</td>
<td></td>
<td></td>
</tr>
<tr>
<td>USAGE</td>
<td>相当于“没有特权”</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="创建账户"><a href="#创建账户" class="headerlink" title="#创建账户"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E8%B4%A6%E6%88%B7">#</a>创建账户</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">USER</span> myuser IDENTIFIED <span class="hljs-keyword">BY</span> <span class="hljs-string">&#x27;mypassword&#x27;</span>;<br></code></pre></td></tr></table></figure>

<h3 id="修改账户名"><a href="#修改账户名" class="headerlink" title="#修改账户名"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E4%BF%AE%E6%94%B9%E8%B4%A6%E6%88%B7%E5%90%8D">#</a>修改账户名</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">UPDATE</span> <span class="hljs-keyword">user</span> <span class="hljs-keyword">SET</span> <span class="hljs-keyword">user</span><span class="hljs-operator">=</span><span class="hljs-string">&#x27;newuser&#x27;</span> <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">user</span><span class="hljs-operator">=</span><span class="hljs-string">&#x27;myuser&#x27;</span>;<br>FLUSH PRIVILEGES;<br></code></pre></td></tr></table></figure>

<h3 id="删除账户"><a href="#删除账户" class="headerlink" title="#删除账户"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E8%B4%A6%E6%88%B7">#</a>删除账户</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">USER</span> myuser;<br></code></pre></td></tr></table></figure>

<h3 id="查看权限"><a href="#查看权限" class="headerlink" title="#查看权限"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9F%A5%E7%9C%8B%E6%9D%83%E9%99%90">#</a>查看权限</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SHOW</span> GRANTS <span class="hljs-keyword">FOR</span> myuser;<br></code></pre></td></tr></table></figure>

<h3 id="授予权限"><a href="#授予权限" class="headerlink" title="#授予权限"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%8E%88%E4%BA%88%E6%9D%83%E9%99%90">#</a>授予权限</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">GRANT</span> <span class="hljs-keyword">SELECT</span>, <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">ON</span> <span class="hljs-operator">*</span>.<span class="hljs-operator">*</span> <span class="hljs-keyword">TO</span> myuser;<br></code></pre></td></tr></table></figure>

<h3 id="删除权限"><a href="#删除权限" class="headerlink" title="#删除权限"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E6%9D%83%E9%99%90">#</a>删除权限</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">REVOKE</span> <span class="hljs-keyword">SELECT</span>, <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">ON</span> <span class="hljs-operator">*</span>.<span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> myuser;<br></code></pre></td></tr></table></figure>

<h3 id="更改密码"><a href="#更改密码" class="headerlink" title="#更改密码"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9B%B4%E6%94%B9%E5%AF%86%E7%A0%81">#</a>更改密码</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SET</span> PASSWORD <span class="hljs-keyword">FOR</span> myuser <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;mypass&#x27;</span>;<br></code></pre></td></tr></table></figure>

<h2 id="存储过程"><a href="#存储过程" class="headerlink" title="#存储过程"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B">#</a>存储过程</h2><p>存储过程可以看成是对一系列 SQL 操作的批处理。存储过程可以由触发器，其他存储过程以及 Java， Python，PHP 等应用程序调用。</p>
<p><img src="https://oss.javaguide.cn/p3-juejin/60afdc9c9a594f079727ec64a2e698a3~tplv-k3u1fbpfcp-zoom-1.jpeg" srcset="/img/loading.gif" lazyload alt="mysql存储过程">mysql存储过程</p>
<p>使用存储过程的好处：</p>
<ul>
<li>代码封装，保证了一定的安全性；</li>
<li>代码复用；</li>
<li>由于是预先编译，因此具有很高的性能。</li>
</ul>
<p>创建存储过程：</p>
<ul>
<li>命令行中创建存储过程需要自定义分隔符，因为命令行是以 <code>;</code> 为结束符，而存储过程中也包含了分号，因此会错误把这部分分号当成是结束符，造成语法错误。</li>
<li>包含 <code>in</code>、<code>out</code> 和 <code>inout</code> 三种参数。</li>
<li>给变量赋值都需要用 <code>select into</code> 语句。</li>
<li>每次只能给一个变量赋值，不支持集合的操作。</li>
</ul>
<p>需要注意的是：<strong>阿里巴巴《Java 开发手册》强制禁止使用存储过程。因为存储过程难以调试和扩展，更没有移植性。</strong></p>
<p><img src="https://oss.javaguide.cn/p3-juejin/93a5e011ade4450ebfa5d82057532a49~tplv-k3u1fbpfcp-zoom-1.png" srcset="/img/loading.gif" lazyload alt="img"></p>
<p>至于到底要不要在项目中使用，还是要看项目实际需求，权衡好利弊即可！</p>
<h3 id="创建存储过程"><a href="#创建存储过程" class="headerlink" title="#创建存储过程"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B">#</a>创建存储过程</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">PROCEDURE</span> IF <span class="hljs-keyword">EXISTS</span> `proc_adder`;<br>DELIMITER ;;<br><span class="hljs-keyword">CREATE</span> DEFINER<span class="hljs-operator">=</span>`root`@`localhost` <span class="hljs-keyword">PROCEDURE</span> `proc_adder`(<span class="hljs-keyword">IN</span> a <span class="hljs-type">int</span>, <span class="hljs-keyword">IN</span> b <span class="hljs-type">int</span>, <span class="hljs-keyword">OUT</span> sum <span class="hljs-type">int</span>)<br><span class="hljs-keyword">BEGIN</span><br>    <span class="hljs-keyword">DECLARE</span> c <span class="hljs-type">int</span>;<br>    if a <span class="hljs-keyword">is</span> <span class="hljs-keyword">null</span> <span class="hljs-keyword">then</span> <span class="hljs-keyword">set</span> a <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;<br>    <span class="hljs-keyword">end</span> if;<br><br>    if b <span class="hljs-keyword">is</span> <span class="hljs-keyword">null</span> <span class="hljs-keyword">then</span> <span class="hljs-keyword">set</span> b <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;<br>    <span class="hljs-keyword">end</span> if;<br><br>    <span class="hljs-keyword">set</span> sum  <span class="hljs-operator">=</span> a <span class="hljs-operator">+</span> b;<br><span class="hljs-keyword">END</span><br>;;<br>DELIMITER ;<br></code></pre></td></tr></table></figure>

<h3 id="使用存储过程"><a href="#使用存储过程" class="headerlink" title="#使用存储过程"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E4%BD%BF%E7%94%A8%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B">#</a>使用存储过程</h3><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs less"><span class="hljs-selector-tag">set</span> @<span class="hljs-selector-tag">b</span>=<span class="hljs-number">5</span>;<br><span class="hljs-selector-tag">call</span> <span class="hljs-selector-tag">proc_adder</span>(<span class="hljs-number">2</span>,<span class="hljs-variable">@b</span>,<span class="hljs-variable">@s</span>);<br><span class="hljs-selector-tag">select</span> @<span class="hljs-selector-tag">s</span> <span class="hljs-selector-tag">as</span> <span class="hljs-selector-tag">sum</span>;<br></code></pre></td></tr></table></figure>

<h2 id="游标"><a href="#游标" class="headerlink" title="#游标"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%B8%B8%E6%A0%87">#</a>游标</h2><p>游标（cursor）是一个存储在 DBMS 服务器上的数据库查询，它不是一条 <code>SELECT</code> 语句，而是被该语句检索出来的结果集。</p>
<p>在存储过程中使用游标可以对一个结果集进行移动遍历。</p>
<p>游标主要用于交互式应用，其中用户需要滚动屏幕上的数据，并对数据进行浏览或做出更改。</p>
<p>使用游标的几个明确步骤：</p>
<ul>
<li><p>在使用游标前，必须声明(定义)它。这个过程实际上没有检索数据， 它只是定义要使用的 <code>SELECT</code> 语句和游标选项。</p>
</li>
<li><p>一旦声明，就必须打开游标以供使用。这个过程用前面定义的 SELECT 语句把数据实际检索出来。</p>
</li>
<li><p>对于填有数据的游标，根据需要取出(检索)各行。</p>
</li>
<li><p>在结束游标使用时，必须关闭游标，可能的话，释放游标(有赖于具</p>
<p>体的 DBMS)。</p>
</li>
</ul>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs sql">DELIMITER $<br><span class="hljs-keyword">CREATE</span>  <span class="hljs-keyword">PROCEDURE</span> getTotal()<br><span class="hljs-keyword">BEGIN</span><br>    <span class="hljs-keyword">DECLARE</span> total <span class="hljs-type">INT</span>;<br>    <span class="hljs-comment">-- 创建接收游标数据的变量</span><br>    <span class="hljs-keyword">DECLARE</span> sid <span class="hljs-type">INT</span>;<br>    <span class="hljs-keyword">DECLARE</span> sname <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">10</span>);<br>    <span class="hljs-comment">-- 创建总数变量</span><br>    <span class="hljs-keyword">DECLARE</span> sage <span class="hljs-type">INT</span>;<br>    <span class="hljs-comment">-- 创建结束标志变量</span><br>    <span class="hljs-keyword">DECLARE</span> done <span class="hljs-type">INT</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">false</span>;<br>    <span class="hljs-comment">-- 创建游标</span><br>    <span class="hljs-keyword">DECLARE</span> cur <span class="hljs-keyword">CURSOR</span> <span class="hljs-keyword">FOR</span> <span class="hljs-keyword">SELECT</span> id,name,age <span class="hljs-keyword">from</span> cursor_table <span class="hljs-keyword">where</span> age<span class="hljs-operator">&gt;</span><span class="hljs-number">30</span>;<br>    <span class="hljs-comment">-- 指定游标循环结束时的返回值</span><br>    <span class="hljs-keyword">DECLARE</span> CONTINUE HANDLER <span class="hljs-keyword">FOR</span> <span class="hljs-keyword">NOT</span> FOUND <span class="hljs-keyword">SET</span> done <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;<br>    <span class="hljs-keyword">SET</span> total <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;<br>    <span class="hljs-keyword">OPEN</span> cur;<br>    <span class="hljs-keyword">FETCH</span> cur <span class="hljs-keyword">INTO</span> sid, sname, sage;<br>    WHILE(<span class="hljs-keyword">NOT</span> done)<br>    DO<br>        <span class="hljs-keyword">SET</span> total <span class="hljs-operator">=</span> total <span class="hljs-operator">+</span> <span class="hljs-number">1</span>;<br>        <span class="hljs-keyword">FETCH</span> cur <span class="hljs-keyword">INTO</span> sid, sname, sage;<br>    <span class="hljs-keyword">END</span> WHILE;<br><br>    <span class="hljs-keyword">CLOSE</span> cur;<br>    <span class="hljs-keyword">SELECT</span> total;<br><span class="hljs-keyword">END</span> $<br>DELIMITER ;<br><br><span class="hljs-comment">-- 调用存储过程</span><br><span class="hljs-keyword">call</span> getTotal();<br></code></pre></td></tr></table></figure>

<h2 id="触发器"><a href="#触发器" class="headerlink" title="#触发器"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E8%A7%A6%E5%8F%91%E5%99%A8">#</a>触发器</h2><p>触发器是一种与表操作有关的数据库对象，当触发器所在表上出现指定事件时，将调用该对象，即表的操作事件触发表上的触发器的执行。</p>
<p>我们可以使用触发器来进行审计跟踪，把修改记录到另外一张表中。</p>
<p>使用触发器的优点：</p>
<ul>
<li>SQL 触发器提供了另一种检查数据完整性的方法。</li>
<li>SQL 触发器可以捕获数据库层中业务逻辑中的错误。</li>
<li>SQL 触发器提供了另一种运行计划任务的方法。通过使用 SQL 触发器，您不必等待运行计划任务，因为在对表中的数据进行更改之前或之后会自动调用触发器。</li>
<li>SQL 触发器对于审计表中数据的更改非常有用。</li>
</ul>
<p>使用触发器的缺点：</p>
<ul>
<li>SQL 触发器只能提供扩展验证，并且不能替换所有验证。必须在应用程序层中完成一些简单的验证。例如，您可以使用 JavaScript 在客户端验证用户的输入，或者使用服务器端脚本语言（如 JSP，PHP，ASP.NET，Perl）在服务器端验证用户的输入。</li>
<li>从客户端应用程序调用和执行 SQL 触发器是不可见的，因此很难弄清楚数据库层中发生了什么。</li>
<li>SQL 触发器可能会增加数据库服务器的开销。</li>
</ul>
<p>MySQL 不允许在触发器中使用 CALL 语句 ，也就是不能调用存储过程。</p>
<blockquote>
<p>  注意：在 MySQL 中，分号 <code>;</code> 是语句结束的标识符，遇到分号表示该段语句已经结束，MySQL 可以开始执行了。因此，解释器遇到触发器执行动作中的分号后就开始执行，然后会报错，因为没有找到和 BEGIN 匹配的 END。</p>
<p>  这时就会用到 <code>DELIMITER</code> 命令（DELIMITER 是定界符，分隔符的意思）。它是一条命令，不需要语句结束标识，语法为：<code>DELIMITER new_delemiter</code>。<code>new_delemiter</code> 可以设为 1 个或多个长度的符号，默认的是分号 <code>;</code>，我们可以把它修改为其他符号，如 <code>$</code> - <code>DELIMITER $</code> 。在这之后的语句，以分号结束，解释器不会有什么反应，只有遇到了 <code>$</code>，才认为是语句结束。注意，使用完之后，我们还应该记得把它给修改回来。</p>
</blockquote>
<p>在 MySQL 5.7.2 版之前，可以为每个表定义最多六个触发器。</p>
<ul>
<li><code>BEFORE INSERT</code> - 在将数据插入表格之前激活。</li>
<li><code>AFTER INSERT</code> - 将数据插入表格后激活。</li>
<li><code>BEFORE UPDATE</code> - 在更新表中的数据之前激活。</li>
<li><code>AFTER UPDATE</code> - 更新表中的数据后激活。</li>
<li><code>BEFORE DELETE</code> - 在从表中删除数据之前激活。</li>
<li><code>AFTER DELETE</code> - 从表中删除数据后激活。</li>
</ul>
<p>但是，从 MySQL 版本 5.7.2+开始，可以为同一触发事件和操作时间定义多个触发器。</p>
<p>**<code>NEW</code> 和 <code>OLD</code>**：</p>
<ul>
<li>MySQL 中定义了 <code>NEW</code> 和 <code>OLD</code> 关键字，用来表示触发器的所在表中，触发了触发器的那一行数据。</li>
<li>在 <code>INSERT</code> 型触发器中，<code>NEW</code> 用来表示将要（<code>BEFORE</code>）或已经（<code>AFTER</code>）插入的新数据；</li>
<li>在 <code>UPDATE</code> 型触发器中，<code>OLD</code> 用来表示将要或已经被修改的原数据，<code>NEW</code> 用来表示将要或已经修改为的新数据；</li>
<li>在 <code>DELETE</code> 型触发器中，<code>OLD</code> 用来表示将要或已经被删除的原数据；</li>
<li>使用方法：<code>NEW.columnName</code> （columnName 为相应数据表某一列名）</li>
</ul>
<h3 id="创建触发器"><a href="#创建触发器" class="headerlink" title="#创建触发器"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%9B%E5%BB%BA%E8%A7%A6%E5%8F%91%E5%99%A8">#</a>创建触发器</h3><blockquote>
<p>  提示：为了理解触发器的要点，有必要先了解一下创建触发器的指令。</p>
</blockquote>
<p><code>CREATE TRIGGER</code> 指令用于创建触发器。</p>
<p>语法：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TRIGGER</span> trigger_name<br>trigger_time<br>trigger_event<br><span class="hljs-keyword">ON</span> table_name<br><span class="hljs-keyword">FOR</span> <span class="hljs-keyword">EACH</span> <span class="hljs-type">ROW</span><br><span class="hljs-keyword">BEGIN</span><br>  trigger_statements<br><span class="hljs-keyword">END</span>;<br></code></pre></td></tr></table></figure>

<p>说明：</p>
<ul>
<li><code>trigger_name</code>：触发器名</li>
<li><code>trigger_time</code> : 触发器的触发时机。取值为 <code>BEFORE</code> 或 <code>AFTER</code>。</li>
<li><code>trigger_event</code> : 触发器的监听事件。取值为 <code>INSERT</code>、<code>UPDATE</code> 或 <code>DELETE</code>。</li>
<li><code>table_name</code> : 触发器的监听目标。指定在哪张表上建立触发器。</li>
<li><code>FOR EACH ROW</code>: 行级监视，Mysql 固定写法，其他 DBMS 不同。</li>
<li><code>trigger_statements</code>: 触发器执行动作。是一条或多条 SQL 语句的列表，列表内的每条语句都必须用分号 <code>;</code> 来结尾。</li>
</ul>
<p>当触发器的触发条件满足时，将会执行 <code>BEGIN</code> 和 <code>END</code> 之间的触发器执行动作。</p>
<p>示例：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs sql">DELIMITER $<br><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TRIGGER</span> `trigger_insert_user`<br>AFTER <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">ON</span> `<span class="hljs-keyword">user</span>`<br><span class="hljs-keyword">FOR</span> <span class="hljs-keyword">EACH</span> <span class="hljs-type">ROW</span><br><span class="hljs-keyword">BEGIN</span><br>    <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> `user_history`(user_id, operate_type, operate_time)<br>    <span class="hljs-keyword">VALUES</span> (NEW.id, <span class="hljs-string">&#x27;add a user&#x27;</span>,  now());<br><span class="hljs-keyword">END</span> $<br>DELIMITER ;<br></code></pre></td></tr></table></figure>

<h3 id="查看触发器"><a href="#查看触发器" class="headerlink" title="#查看触发器"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E6%9F%A5%E7%9C%8B%E8%A7%A6%E5%8F%91%E5%99%A8">#</a>查看触发器</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">SHOW</span> TRIGGERS;<br></code></pre></td></tr></table></figure>

<h3 id="删除触发器"><a href="#删除触发器" class="headerlink" title="#删除触发器"></a><a target="_blank" rel="noopener" href="https://javaguide.cn/database/sql/sql-syntax-summary.html#%E5%88%A0%E9%99%A4%E8%A7%A6%E5%8F%91%E5%99%A8">#</a>删除触发器</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TRIGGER</span> IF <span class="hljs-keyword">EXISTS</span> trigger_insert_user;<br></code></pre></td></tr></table></figure>
                
              </div>
            
            <hr/>
            <div>
              <div class="post-metas my-3">
  
    <div class="post-meta mr-3 d-flex align-items-center">
      <i class="iconfont icon-category"></i>
      

<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/categories/DB/" class="category-chain-item">DB</a>
  
  

      </span>
    
  
</span>

    </div>
  
  
    <div class="post-meta">
      <i class="iconfont icon-tags"></i>
      
        <a href="/tags/DB/" class="print-no-link">#DB</a>
      
    </div>
  
</div>


              
  

  <div class="license-box my-3">
    <div class="license-title">
      <div>SQL语法基础知识.md</div>
      <div>http://example.com/2024/02/27/DB/basic_knowledge/SQL语法基础知识/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>fyy</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2024年2月27日</div>
        </div>
      
      
      
        <div class="license-meta-item">
          <div>许可协议</div>
          <div>
            
              
              
                <a class="print-no-link" target="_blank" href="https://creativecommons.org/licenses/by/4.0/">
                  <span class="hint--top hint--rounded" aria-label="BY - 署名">
                    <i class="iconfont icon-by"></i>
                  </span>
                </a>
              
            
          </div>
        </div>
      
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2024/03/26/Redis/Redis%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="Redi面试题整理">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">Redi面试题整理</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2024/02/27/DB/basic_knowledge/NoSQL%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" title="NoSQL基础知识.md">
                        <span class="hidden-mobile">NoSQL基础知识.md</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
  
  
    <article id="comments" lazyload>
      
  <div id="valine"></div>
  <script type="text/javascript">
    Fluid.utils.loadComments('#valine', function() {
      Fluid.utils.createScript('https://lib.baomitu.com/valine/1.5.1/Valine.min.js', function() {
        var options = Object.assign(
          {"appId":"ufph8TbmK43d1JfQxLvss4KY-MdYXbMMI","appKey":"96APiPOtZEiCQlv5h3jjZfbC","path":"window.location.pathname","placeholder":null,"avatar":"retro","meta":["nick","mail","link"],"requiredFields":[],"pageSize":10,"lang":"zh-CN","highlight":false,"recordIP":false,"serverURLs":"","emojiCDN":null,"emojiMaps":null,"enableQQ":false},
          {
            el: "#valine",
            path: window.location.pathname
          }
        )
        new Valine(options);
        Fluid.utils.waitElementVisible('#valine .vcontent', () => {
          var imgSelector = '#valine .vcontent img:not(.vemoji)';
          Fluid.plugins.imageCaption(imgSelector);
          Fluid.plugins.fancyBox(imgSelector);
        })
      });
    });
  </script>
  <noscript>Please enable JavaScript to view the comments</noscript>


    </article>
  


          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar" style="margin-left: -1rem">
    <div id="toc">
  <p class="toc-header">
    <i class="iconfont icon-list"></i>
    <span>目录</span>
  </p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>


    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v" for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
  </main>

  <footer>
    <div class="footer-inner">
  
    <div class="footer-content">
       <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
    </div>
  
  
    <div class="statistics">
  
  

  
    
      <span id="leancloud-site-pv-container" style="display: none">
        总访问量
        <span id="leancloud-site-pv"></span>
        次
      </span>
    
    
      <span id="leancloud-site-uv-container" style="display: none">
        总访客数
        <span id="leancloud-site-uv"></span>
        人
      </span>
    
    

  
</div>

  
  
  
</div>

  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.4/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>


  <script  src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var subtitle = document.getElementById('subtitle');
      if (!subtitle || !typing) {
        return;
      }
      var text = subtitle.getAttribute('data-typed-text');
      
        typing(text);
      
    })(window, document);
  </script>




  
    <script  src="/js/img-lazyload.js" ></script>
  




  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.20.1/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init(Object.assign({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      scrollSmooth    : true,
      includeTitleTags: true,
      headingsOffset  : -boardTop,
    }, CONFIG.toc));
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }

    Fluid.events.registerRefreshCallback(function() {
      if ('tocbot' in window) {
        tocbot.refresh();
        var toc = jQuery('#toc');
        if (toc.length === 0 || !tocbot) {
          return;
        }
        if (toc.find('.toc-list-item').length > 0) {
          toc.css('visibility', 'visible');
        }
      }
    });
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));

    Fluid.events.registerRefreshCallback(function() {
      if ('anchors' in window) {
        anchors.removeAll();
        var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
        var res = [];
        for (var item of el) {
          res.push('.markdown-body > ' + item.trim());
        }
        if (CONFIG.anchorjs.placement === 'left') {
          anchors.options.class = 'anchorjs-link-left';
        }
        anchors.add(res.join(', '));
      }
    });
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script defer src="/js/leancloud.js" ></script>

  <script  src="/js/local-search.js" ></script>





<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
